/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.unice.miage.oobdoo.manager;

import com.unice.miage.oobdoo.entity.Album;
import com.unice.miage.oobdoo.entity.Note;
import com.unice.miage.oobdoo.entity.Partage;
import com.unice.miage.oobdoo.entity.Photo;
import com.unice.miage.oobdoo.entity.Utilisateur;
import com.unice.miage.oobdoo.enumeration.Statut;
import java.io.File;
import java.util.Collection;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Remi
 */
@Stateless
public class AlbumManager {

    @PersistenceContext
    private EntityManager em;
    private String c;

    public void setPATH(String c) {
        this.c = c;
    }

    public String getPATH() {
        return this.c;
    }

    /**
     * Creation d'un album
     * @param auteur - l'utilisateur auteur de l'album
     * @param nom - le nom de l'album
     * @param description - la description de l'album
     * @param statut - le statut de l'album
     * @return l'album cree
     */
    public Album creerAlbum(Utilisateur auteur, String nom, String description, Statut statut) {
        Album a = new Album(auteur, nom, description, statut);
        em.persist(a);
        String strDirectory = this.getPATH() + "upload/" + auteur.getId() + "/" + a.getId();
        System.out.println(strDirectory);
        try {
            (new File(strDirectory)).mkdir();
        } catch (Exception ex) {
            // SHOW ERROR
        }
        return a;
    }

    /**
     * Renvoie un album selon son id
     * @param id - l'id de l'album
     * @return l'album
     */
    public Album getAlbumById(int id) {
        /**
         * @TODO : VERIF SI SON ALBUM OU PARTAGEE
         */
        Album a = em.find(Album.class, id);
        return a;
    }

    public void addPhoto(Album a, Photo p) {
        a.addPhoto(p);
        em.merge(a);
    }

    public String getOnePictureByAlbumId(int idAlbum) {
        Album a = this.getAlbumById(idAlbum);
        String photo = a.getOnePicture();
        return photo;
    }

    public void addNote(Album a, Note n) {
        a.addNote(n);
        em.merge(a);
    }

    public float getGlobalScore(Album a) {
        Collection<Note> notes = a.getNotes();
        float somme = 0;
        for (Note n : notes) {
            somme += n.getValue();
        }
        try {
            float moyenne = somme / notes.size();
            return moyenne;
        } catch (ArithmeticException e) {
            return (float) 0.0;
        } catch (Exception ex) {
            System.err.println("ex=" + ex.getClass());
            return (float) 0.0;
        }
    }

    public void addPartage(Album a, Partage p) {
        a.getPartages().add(p);
        em.merge(a);
    }

    public void deletePartage(Album a, Partage p)
    {
        Collection<Partage> partages = a.getPartages();

        for (Partage partage : partages) {
            if (partage.getId() == p.getId()) {
                partages.remove(partage);
                break;
            }
        }
        em.merge(a);
    }
    
    public void deletePhoto(Album a, Photo p)
    {
        Collection<Photo> photos = a.getPhotos();

        for (Photo photo : photos) {
            if (photo.getId() == p.getId()) {
                photos.remove(photo);
                break;
            }
        }
        em.merge(a);
    }
    
    public void deleteNote(Album a, Note n)
    {
        Collection<Note> notes = a.getNotes();

        for (Note note : notes) {
            if (note.getId() == n.getId()) {
                notes.remove(note);
                break;
            }
        }
        em.merge(a);
    }
    
    public void deleteAlbum(Album a)
    {
        try {
            em.remove(em.merge(a));
        } catch (Exception ex) {
            System.err.println("CommentaireManager.deleteCommentaire, exception=" + ex);
        }
    }

    public Collection<Album> getAllAlbumsPublic() {
        Query q = em.createQuery("select a from Album a where a.statut = :statut", Album.class);
        q.setParameter("statut", Statut.PUBLIC);
        return q.getResultList();
    }

    public boolean isAuthorizedToView(Album a, Utilisateur u) {
        try {
            Collection<Utilisateur> utilisateurs = a.getUtilisateursPartagesValide();
            if (utilisateurs != null) {
                if (a.getStatut() == Statut.PUBLIC || a.getAuteur().getId() == u.getId() || containsUtilisateur(a, u)) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } catch (NullPointerException e) {
            return false;
        } catch (Exception ex) {
            System.err.println("ex=" + ex.getClass());
            return false;
        }
    }

    private boolean containsUtilisateur(Album album, Utilisateur u) {
        boolean bool = false;
        for (Utilisateur user : album.getUtilisateursPartagesValide()) {
            if (user.getId() == u.getId()) {
                bool = true;
                break;
            }
        }
        return bool;
    }
}
